package com.iwhalecloud.bss.kite.cucc.web.context;

import java.util.Objects;
import java.util.Optional;

import com.iwhalecloud.bss.kite.common.constant.ErrorConsts;
import com.iwhalecloud.bss.kite.common.util.KiteStringUtils;
import com.iwhalecloud.bss.kite.cucc.common.cache.CuccKiteContextCache;
import com.iwhalecloud.bss.kite.cucc.common.dto.CuccContextDTO;
import com.iwhalecloud.bss.kite.web.context.KiteWebContext;
import com.ztesoft.bss.common.util.ContextUtil;

public class CuccKiteWebContext {

    /**
     * 2小时失效
     */
    private static final int EXPIRE_TIME = 60 * 60 * 2;

    /**
     * 上下文对象
     */
    private static final ThreadLocal<CuccContextDTO> CUCC_CONTEXT_LOCAL = new ThreadLocal<>();

    private static String getContextId() {
        CuccContextDTO context = CUCC_CONTEXT_LOCAL.get();
        if (Objects.isNull(context)) {
            String contextId = ContextUtil.getHttpSessoinId();
            if (Objects.isNull(contextId)) {
                ErrorConsts.CONTEXT_NOT_FOUNT.throwOut();
            }
            return contextId;
        }
        return context.getContextId();
    }

    /**
     * 获取上下文信息
     *
     * @return
     */
    public static CuccContextDTO getCuccContext() {
        CuccContextDTO context = CUCC_CONTEXT_LOCAL.get();
        context = Optional.ofNullable(context).orElseGet(() -> {
            CuccContextDTO ctx = CuccKiteContextCache.get(KiteWebContext.getKiteContextId());
            if (Objects.nonNull(ctx)) {
                CUCC_CONTEXT_LOCAL.set(ctx);
            }
            return ctx;
        });

        if (Objects.isNull(context)) {
            ErrorConsts.CONTEXT_CUST_NOT_FOUNT.throwOut();
        }
        return context;
    }

    /**
     * 初始化上下文信息,放到缓存
     *
     * @param contextId
     * @param cust
     */
    public static void initCuccContext(String contextId, CuccContextDTO context) {
        if (KiteStringUtils.isEmpty(contextId) || Objects.isNull(context)) {
            ErrorConsts.CONTEXT_PARAM_IS_NULL.throwOut();
        }
        context.setContextId(contextId);
        setContext(context);
    }

    private static void setContext(CuccContextDTO context) {
        CUCC_CONTEXT_LOCAL.set(context);
        CuccKiteContextCache.put(context.getContextId(), context, EXPIRE_TIME);
    }
}
